package com.wuyb.service;

import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wuyb.pojo.Meeting;
import com.wuyb.pojo.MeetingNotice;
import com.wuyb.pojo.entity.BaseResponse;
import com.wuyb.pojo.param.MeetingAddParam;
import com.wuyb.pojo.param.MeetingLicenceParam;
import com.wuyb.pojo.param.MeetingUpdateParam;
import com.wuyb.pojo.param.PageParam;

/**
 * 会议服务类接口
 *
 * @Author: wyb
 * @Date: 2024/01/05/0:08
 * @Description:
 */
public interface MeetingService extends IService<Meeting> {

    /**
     * 分页查看所有会议
     * @param pageParam
     * @return
     */
    BaseResponse<?> select(PageParam pageParam);


    /**
     * 条件分页查看会议
     * @param pageParam
     * @param wrapper
     * @return
     */
    BaseResponse<?> select(PageParam pageParam, QueryWrapper<Meeting> wrapper);

    BaseResponse<?> add(MeetingAddParam meeting);

    BaseResponse<?> update(MeetingUpdateParam meeting);

    BaseResponse<?> delete(String mid);

    BaseResponse<?> selectByUser(PageParam pageParam);

    BaseResponse<?> addByUser(MeetingAddParam meeting);

    BaseResponse<?> updateByUser(MeetingUpdateParam meeting);

    BaseResponse<?> deleteByUser(String mid);

    /**
     * 设置许可
     * @param param
     * @return
     */
    BaseResponse<?> setLicence(MeetingLicenceParam param);


    /**
     * 用户设置许可
     * @param param
     * @return
     */
    BaseResponse<?> setLicenceByUser(MeetingLicenceParam param);

    /**
     * 查看自己的历史会议列表
     * @return
     */
    BaseResponse<?> selectByHistory();

    /**
     * 分页查看自己加入的会议列表
     *
     * @param pageParam
     * @return
     */
    BaseResponse<?> selectByUserJoined(PageParam pageParam);


    /**
     * 加入会议
     * @param mid
     * @param password
     * @return
     */
    BaseResponse<?> joinMeeting(String mid,String password);

    /**
     * 用户离开会议
     * @param mid
     * @return
     */
    BaseResponse<?> outMeeting(String mid);

    /**
     * 通过ID获取会议信息
     * @param id
     * @param isAdmin
     * @return
     */
    BaseResponse<?> getMeetingById(String id, Boolean isAdmin);

    /**
     * 分页查看自己会议的用户签到列表
     *
     * @param mid
     * @param current
     * @param size
     * @return
     */
    BaseResponse<?> selectHadSignInList(String mid, Integer current, Integer size);


    /**
     * 选择会议
     * @param current
     * @param size
     * @return
     */
    BaseResponse<?> selectMeetingApplications(Integer current, Integer size);

    /**
     * 回复会议
     * @param meetingid
     * @param userid
     * @param result
     * @return
     */
    BaseResponse<?> replyMeetingApplication(String meetingid, Integer userid, Integer result);


    /**
     * 获得自己参加会议的通知列表(未读)
     * @param current
     * @param size
     * @return
     */
    BaseResponse<?> selectMeetingNoticePush(Integer current, Integer size);

    /**
     * 对会议通知进行已读
     *
     * @param informId
     * @return
     */
    BaseResponse<?> readMeetinInfrom(Integer informId);

    /**
     * 为会议加入公告
     *
     * @param meetingNotice
     * @return
     */
    BaseResponse<?> addMeetingNotice(MeetingNotice meetingNotice);

    /**
     * 获取mid对应会议的公告列表
     *
     * @param mid
     * @return
     */
    BaseResponse<?> getMeetingNoticeById(String mid, Integer current, Integer size);

    /**
     * 删除指定id的公告
     *
     * @param noticeId
     * @return
     */
    BaseResponse<?> delMeetingNoticeById(String meeingId,Integer noticeId);

    /**
     * 编辑会议公告
     * @return
     */
    BaseResponse<?> updateMeetingNotice(MeetingNotice meetingNotice);

    /**
     * 分页查看自己会议的参会成员与其会议中状态的列表
     * @param mid
     * @param current
     * @param size
     * @return
     */
    BaseResponse<?> getMeetingUsersList(String mid, Integer current, Integer size);

    /**
     * 根据用户id将其踢出会议
     * @param mid
     * @param userId
     * @return
     */
    BaseResponse<?> delMeetingUserById(String mid, Integer userId);

    /**
     * 根据id查看会议的已入会用户列表
     * @param mid
     * @return
     */
    BaseResponse<?> getExistUserList(String mid);

    /**
     * 删除历史会议
     * @param mid
     * @return
     */
    BaseResponse<?> delHistoryMeeting(String mid);

    /**
     * 根据id查看用户在会议的状态
     * @param mid
     * @param uid
     * @return
     */
    BaseResponse<?> getMeetingUsersStateById(String mid, Integer uid);


    /**
     * 修改用户在指定会议的状态，可以禁止操作,批量修改
     * @param mid
     * @param jsonObject
     * @return
     */
    BaseResponse<?> setMeetingUsersStateByIdMany(String mid, JSONObject jsonObject);

    /**
     * 根据id修改用户在会议的状态
     * @param mid
     * @param uid
     * @param jsonObject
     * @return
     */
    BaseResponse<?> setMeetingUsersStateByIdOne(String mid, Integer uid, JSONObject jsonObject);

    /**
     * 查看所有会议的开始时间
     * @return
     */
    BaseResponse<?> selectAllStartDateTime();

    /**
     * 查看未结束会议的开始时间
     * @return
     */
    BaseResponse<?> selectStartDateTime();

    /**
     * 获取mid对应会议的入会密码
     * @param mid
     * @return
     */
    BaseResponse<?> getMeetingPasswordById(String mid);

    /**
     * 管理员获取mid对应会议的入会密码
     * @param mid
     * @return
     */
    BaseResponse<?> getMeetingPasswordByIdAdmin(String mid);
}
